package com.common.code.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
 *  Swagger文档访问地址
 *  请看WebMvcConfig做了详解配置
 */
@Configuration
@EnableSwagger2
@Slf4j

public class SwaggerConfig {
    /**
     * 创建一个Docket对象
     * 调用select()方法，
     * 生成ApiSelectorBuilder对象实例，该对象负责定义外漏的API入口
     * 通过使用RequestHandlerSelectors和PathSelectors来提供Predicate，在此我们使用any()方法，将所有API都通过Swagger进行文档管理
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.common.code.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
        //api文档名称
        .title("klz的Swagger开发文档")
        //描述
        .description("Springboot整合Swagger2")
        //服务条款
        .termsOfServiceUrl("localhost:8080/klz")
        //作者个人信息
//      .contact(new Contact("name","url","email"))
        //版本
        .version("1.0")
        .build();
    }
}


/**
 * swagger2的一些信息：
 * @Api：修饰整个类，描述Controller的作用
 *
 * @ApiOperation：描述一个类的一个方法，或者说一个接口
 *
 * @ApiParam：单个参数描述
 *
 * @ApiModel：用对象来接收参数
 *
 * @ApiProperty：用对象接收参数时，描述对象的一个字段
 *
 * @ApiResponse：HTTP响应其中1个描述
 *
 * @ApiResponses：HTTP响应整体描述
 *
 * @ApiIgnore：使用该注解忽略这个API
 *
 * @ApiError ：发生错误返回的信息
 *
 * @ApiImplicitParam：一个请求参数
 *
 * @ApiImplicitParams：多个请求参数
 *
 * dataType和paramType的区别:
 *
 * @ApiImplicitParam(name = "id",value = "用户id",required = true,dataType = "int",paramType = "body")
 *
 * dataType="int" 代表请求参数类型为int类型，当然也可以是Map、User、String等；
 *
 * paramType="body" 代表参数应该放在请求的什么地方：
 *
 *     header-->放在请求头。请求参数的获取：@RequestHeader(代码中接收注解)
 *     query-->用于get请求的参数拼接。请求参数的获取：@RequestParam(代码中接收注解)
 *     path（用于restful接口）-->请求参数的获取：@PathVariable(代码中接收注解)
 *     body-->放在请求体。请求参数的获取：@RequestBody(代码中接收注解)
 *     form（不常用）
 */
